﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Recursos.Model;
using System.Drawing;
using System.Globalization;



namespace Recursos.View
{
    public partial class AgendaSemanaView : System.Web.UI.Page
    {
        static private int[,] mapReservaciones;
        static private Button[,] mapBotones;
        static private Dictionary<string, int> mapHoras;

        protected void Page_Load(object sender, EventArgs e)
        {
            mapBotones = new Button[14, 6] {{L07, K07, M07, J07, V07, S07},
                                            {L08, K08, M08, J08, V08, S08},
                                            {L09, K09, M09, J09, V09, S09},
                                            {L10, K10, M10, J10, V10, S10},
                                            {L11, K11, M11, J11, V11, S11},
                                            {L13, K13, M13, J13, V13, S13},
                                            {L14, K14, M14, J14, V14, S14},
                                            {L15, K15, M15, J15, V15, S15},
                                            {L16, K16, M16, J16, V16, S16},
                                            {L17, K17, M17, J17, V17, S17},
                                            {L18, K18, M18, J18, V18, S18},
                                            {L19, K19, M19, J19, V19, S19},
                                            {L20, K20, M20, J20, V20, S20},
                                            {L21, K21, M21, J21, V21, S21},};

            mapHoras = new Dictionary<string,int> {{"07", 0}, {"08", 1}, {"09", 2}, {"10", 3}, {"11", 4}, 
            {"13", 5}, {"14", 6}, {"15", 7}, {"16", 8}, {"17", 9}, {"18", 10}, {"19", 11},{"20", 12}, {"21", 13}};

            var userSecurity = ((Usuario)Session["UserLogged"]);


            if (!Page.IsPostBack && userSecurity != null)
            {
                CargarEspacios();
                DateTime elegida;
                if (Session["fechaDesp"] != null)
                    elegida = DateTime.Parse((string)Session["fechaDesp"]);
                else
                    elegida = inicioSemana(DateTime.Now.Date);
                Calendar1.SelectedDate = Calendar1.VisibleDate = elegida;

                if (Session["espacioDesp"] != null)
                    DropDownEspacios.SelectedValue = (string)Session["espacioDesp"];

                DibujarSemana();
            }
            else if (userSecurity == null)
            {
                Response.Redirect("~/NoAccess.aspx");
            }
        }

        private void CargarEspacios()
        {
            var espacios = new EspacioModel();
            DropDownEspacios.DataSource = espacios.CargarEspacios();
            DropDownEspacios.DataTextField = "Codigo";
            DropDownEspacios.DataValueField = "id";
            DropDownEspacios.DataBind();
        }

        private void DibujarSemana()
        {
            LimpiarDespliegue();
            mapReservaciones = new int[14, 6];

            DateTime fechaDespliegue = Calendar1.SelectedDate;
            CultureInfo espanol = new CultureInfo("es-ES");
            labelFecha.Text = fechaDespliegue.Day + "-" + fechaDespliegue.AddDays(5).Day;
            labelFecha.Text += fechaDespliegue.ToString(" \\de MMMMMMMMM \\de yyyy", espanol);

            var model = new RservacionModel();
            var reservaciones = model.CargarReservacionesEspacioAnno(Convert.ToInt32(DropDownEspacios.SelectedValue), fechaDespliegue.Year);
            var reservacionesP = model.CargarReservacionesParticualresEspacioAnno(Convert.ToInt32(DropDownEspacios.SelectedValue), fechaDespliegue.Year);

            loopReservaciones(reservaciones);
            loopReservacionesP(reservacionesP);
        }

        protected void ClickDia(Object sender, EventArgs e)
        {
            Session["fechaDesp"] = Calendar1.SelectedDate.ToString();
            Response.Redirect("~/View/AgendaDiaView.aspx");
            Session["espacioDesp"] = DropDownEspacios.SelectedValue;
            Response.Redirect("~/View/AgendaMesView.aspx");
        }

        protected void ClickMes(Object sender, EventArgs e)
        {
            DateTime primeroMes = new DateTime(Calendar1.SelectedDate.Year, Calendar1.SelectedDate.Month, 1);
            Session["fechaDesp"] = inicioSemana(primeroMes).ToString();
            Session["espacioDesp"] = DropDownEspacios.SelectedValue;
            Response.Redirect("~/View/AgendaMesView.aspx");
        }

        protected void ClickCalendario(Object sender, EventArgs e)
        {
            Calendar1.SelectedDate = inicioSemana(Calendar1.SelectedDate);
            DibujarSemana();
        }

        protected void ClickEspacio(Object sender, EventArgs e)
        {
            DibujarSemana();
        }

        protected void ClickRecuadro(Object sender, EventArgs e)
        {
            Button cuadro = (Button)sender;
            int i = mapHoras[cuadro.ID.Substring(1, 2)];
            int j = indiceDia(cuadro.ID.Substring(0, 1));
            var idRes = mapReservaciones[i, j];
            var comentarios = new RservacionModel();
            string despliegue;
            if (cuadro.BackColor == Color.Gray)
                despliegue = comentarios.ObtenerDetallesReservacion(mapReservaciones[i,j], false);
            else
                despliegue = comentarios.ObtenerDetallesReservacionParticular(mapReservaciones[i, j], false);
            WebMsgBox.Show(despliegue, "Agenda: " + Calendar1.SelectedDate.AddDays(j).ToShortDateString());
        }

        DateTime inicioSemana(DateTime fecha)
        {
            int diff = fecha.DayOfWeek - DayOfWeek.Monday;
            if (diff < 0)
            {
                diff += 7;
            }
            return fecha.AddDays(-1 * diff);
        }

        private void loopReservaciones(IEnumerable<ReservacionCurso> reservaciones)
        {
            foreach (ReservacionCurso reservacion in reservaciones)
            {
                reservacionPeriodica(reservacion.Reservacion, Color.Gray, reservacion.id);
            }
        }

        private void reservacionPeriodica(Reservacion res, Color col, int id)
        {
            var fechaDesp = Calendar1.SelectedDate;
            int i = mapHoras[res.HoraInicio.Split(':')[0]];
            int j;
            string[] dias = res.Dias.Split('-');
            foreach (string dia in dias)
            {
                j = indiceDia(dia);
                if (res.FechaInicio <= fechaDesp.AddDays(j) &&
                    fechaDesp.AddDays(j) <= res.FechaFinal)
                {
                    for (int aux = 0; aux < res.Bloques; aux++)
                    {
                        Button cuadro = mapBotones[i + aux, j];
                        cuadro.BackColor = col;
                        cuadro.Enabled = true;
                        mapReservaciones[i + aux, j] = id;
                    }
                }
            }
        }

        private void loopReservacionesP(IEnumerable<ReservacionParticular> reservaciones)
        {
            var fechaDesp = Calendar1.SelectedDate;
            foreach (ReservacionParticular reservacion in reservaciones)
            {
                if (reservacion.Reservacion.FechaInicio == reservacion.Reservacion.FechaFinal)
                {
                    DateTime fechaRes = (DateTime)reservacion.Reservacion.FechaInicio;
                    if (fechaDesp <= fechaRes && fechaRes <= fechaDesp.AddDays(5))
                    {
                        int j = (int)fechaRes.DayOfWeek - 1;
                        int i = mapHoras[reservacion.Reservacion.HoraInicio.Split(':')[0]];
                        for (int aux = 0; aux < reservacion.Reservacion.Bloques; aux++)
                        {
                            Button cuadro = mapBotones[i + aux, j];
                            cuadro.BackColor = Color.Tan;
                            cuadro.Enabled = true;
                            mapReservaciones[i + aux, j] = reservacion.id;
                        }
                    }
                }
                else
                    reservacionPeriodica(reservacion.Reservacion, Color.Tan, reservacion.id);
            }
        }

        private void LimpiarDespliegue()
        {
            foreach (Button bot in mapBotones)
            {
                bot.BackColor = Color.White;
                bot.Enabled = false;
            }
        }

        int indiceDia(string dia)
        {
            switch (dia)
            {
                case "L":
                    return 0;
                case "K":
                    return 1;
                case "M":
                    return 2;
                case "J":
                    return 3;
                case "V":
                    return 4;
                case "S":
                    return 5;
                default:
                    return -1;
            }
        }
    }
}